package br.com.vfcfw.controller.validator;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedBean;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.FacesValidator;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;

import br.com.vfcfw.commons.util.ConstantesArquitetura;
import br.com.vfcfw.commons.util.ValidacaoUtil;

/**
 * Classe {@link Validator} responsável pela validação de CPF ou CNPJ.
 * 
 * @author Vitor Franco do Carmo (vitor.carmo@cpmbraxis.com)
 * @since 22/05/2014
 * 
 */
@FacesValidator("validator.cpfCnpjValidator")
@ManagedBean(name = "cpfCnpjValidator", eager = true)
@ApplicationScoped
public class CpfCnpjValidator extends BaseValidator {

    /**
     * Valida o CPF/CNPJ.
     */
    @Override
    public void validate(FacesContext facesContext, UIComponent componente, Object valor) throws ValidatorException {

        if (possuiValor(valor)) {

            String cpfCnpj = valor.toString();

            if (!ValidacaoUtil.isCpfCnpjValido(cpfCnpj, false)) {

                boolean isCpf = cpfCnpj.replaceAll("[^0-9]*", "").length() <= 11;

                FacesMessage msg;

                if (isCpf) {

                    msg = new FacesMessage(obterMensagem(ConstantesArquitetura.MSG_ERRO_VALIDACAO_CPF));
                } else {
                    msg = new FacesMessage(obterMensagem(ConstantesArquitetura.MSG_ERRO_VALIDACAO_CNPJ));
                }
                throw new ValidatorException(msg);
            }
        } else {

            throw new ValidatorException(new FacesMessage("Campo CPF/CNPJ obrigatório!"));
        }
    }
}
